package org.opens.javaskill.thread;

public class TryConcurrenty {

    // 线程沉睡10秒, 模拟读数据库
    public static void readDataBase() {
        try {
            System.out.println("begin read database");
            Thread.sleep(1000 * 10);
            System.out.println("read database done");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end read database");
    }

    /**
     * 说明:
     *      1. 单线程模型同一时刻只能做一件事.
     */
    public static void main(String[] args) {
        readDataBase();
        writeToFile();
    }

    // 模拟将内容写入文件
    public static void writeToFile() {
        try {
            System.out.println("begin write file");
            Thread.sleep(1000 * 10);
            System.out.println("write file done");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end write file");
    }


}

class TryConcurrenty2 {

    /**
     * 说明:
     *      1. 使用多线程去打破同一时刻只能做一件事情.
     * 注意:
     *      1. 当运行这个main方法之后, 立即去jconsole中查看会发现不存在main线程, 只存在read-database线程和write-file线程, 原因是:
     *      main线程是一个非守护线程, 所以main在此处的作用是启动两个线程, 启动完之后就结束了.
     */
    public static void main(String[] args) {
        new Thread("read-database") {
            @Override
            public void run() {
                TryConcurrenty.readDataBase();
            }
        }.start();
        new Thread("write-file") {
            @Override
            public void run() {
                TryConcurrenty.writeToFile();
            }
        }.start();
    }

}

class TryConcurrenty3 {

    /**
     * 说明:
     *      1. 线程的创建方式:
     *          - 方式1: 创建一个Thread的匿名类或者使用一个类继承Thread类, 然后使用这个类的start方法时就会创建一个线程.
     */
    public static void main(String[] args) {
        Thread thread = new Thread("my-thread-1") {

            @Override
            public void run() {
                for ( int i = 0; i < 10000; i++ ) {
                    System.out.println("i=> " + i);
                }
            }
        };
        thread.start();
        for ( int j = 0; j < 10000; j++ ) {
            System.out.println("j=> " + j);
        }
    }

}
